/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.consultorio.dao;

import br.com.consultorio.bean.Endereco;
import br.com.consultorio.bean.Funcao;
import br.com.consultorio.bean.Funcionario;
import br.com.consultorio.bean.Pessoa;
import br.com.consultorio.bean.Usuario;
import br.com.consultorio.util.FabricaConexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author L3nfers
 */
public class FuncionarioDaoImp implements FuncionarioDao {

    Connection conn;
    PreparedStatement ps;
    ResultSet rs;
    Pessoa pessoa;
    Funcionario funcionario;
    PessoaDao pessoaDao;

    @Override
    public List pesquisaPorNome(String nome) throws Exception {
        List funcionarios = new ArrayList();

        try {
            String consulta = "SELECT * FROM funcionario f JOIN pessoa p ON p.id = f.idPessoa"
                    + " JOIN endereco e ON p.endereco_id = e.id"
                    + " JOIN funcao c ON c.id = f.funcao_id WHERE p.nome LIKE ?";
            conn = FabricaConexao.abreConexao();
            ps = conn.prepareStatement(consulta);
            ps.setString(1, "%" + nome + "%");
            rs = ps.executeQuery();

            while (rs.next()) {

                funcionario = new Funcionario();

                funcionario.setId(rs.getInt("p.id"));
                funcionario.setNome(rs.getString("p.nome"));
                funcionario.setSalario(rs.getDouble("f.salario"));
                funcionario.setEmail(rs.getString("p.email"));
                funcionario.setCpf(rs.getString("p.cpf"));
               // funcionario.setDataNasc(rs.getDate("p.dataNasc"));
                funcionario.setTelefone(rs.getString("p.telefone"));

                Funcao funcao = new Funcao();
                funcao.setId(rs.getInt("f.funcao_id")); 
                funcao.setNome(rs.getString("nome"));
                funcionario.setFuncao(funcao);

                Endereco endereco = new Endereco();
                endereco.setId(rs.getInt("e.id"));
                endereco.setRua(rs.getString("e.rua"));
                endereco.setCep(rs.getString("e.cep"));
                endereco.setBairro(rs.getString("e.bairro"));
                endereco.setCidade(rs.getString("e.cidade"));
                endereco.setEstado(rs.getString("e.estado"));
                funcionario.setEndereco(endereco);



                funcionarios.add(funcionario);
            }

        } catch (Exception e) {
            throw new Exception("Funcionario - erro ao tentar PESQUISAR POR NOME " + e.getMessage());
        } finally {
            FabricaConexao.fechaConexao(conn, ps, rs);
        }
        return funcionarios;
    }

    @Override
    public Object salvar(Object obj) throws Exception {

        pessoaDao = new PessoaDaoImp();
        funcionario = new Funcionario();
        Funcao funcao = new Funcao();
        funcionario = (Funcionario) pessoaDao.salvar(obj);
        try {

            String SQL = "INSERT INTO funcionario(idPessoa, salario, funcao_id) VALUES(?, ?, ?)";
            conn = FabricaConexao.abreConexao();
            ps = conn.prepareStatement(SQL);

            ps.setInt(1, funcionario.getId());
            ps.setDouble(2, funcionario.getSalario());
            ps.setInt(3, funcionario.getFuncao().getId());
            
            ps.executeUpdate();

        } catch (Exception e) {
            throw new Exception("Funcionario - Erro ao Tentar Inserir Dados."
                    + e.getMessage());
        } finally {
            FabricaConexao.fechaConexao(conn, ps);
        }

        return funcionario;
    }

    @Override
    public void alterar(Object obj) throws Exception {
        funcionario = (Funcionario) obj;
        pessoaDao = new PessoaDaoImp();

        try {

            pessoaDao.alterar(funcionario);

            String SQL = "UPDATE funcionario SET salario=?, funcao_id = ? WHERE idPessoa=?";
            conn = FabricaConexao.abreConexao();
            ps = conn.prepareStatement(SQL);

            ps.setDouble(1, funcionario.getSalario());
            ps.setInt(2, funcionario.getFuncao().getId());
            ps.setInt(3, funcionario.getId());          
            ps.executeUpdate();

        } catch (Exception e) {
            throw new Exception("Funcionario - Erro ao Tentar ALTERAR Dados."
                    + e.getMessage());
        } finally {
            FabricaConexao.fechaConexao(conn, ps);
        }
    }

    @Override
    public void excluir(int id) throws Exception {
        try {
            String SQL = "DELETE FROM funcionario WHERE idPessoa = ?";
            conn = FabricaConexao.abreConexao();
            ps = conn.prepareStatement(SQL);

            ps.setInt(1, id);
            ps.executeUpdate();
        } catch (Exception e) {
            throw new Exception("Funcionario - Erro ao Tentar EXCLUIR Dados."
                    + e.getMessage());
        } finally {
            FabricaConexao.fechaConexao(conn, ps);
        }
    }

    @Override
    public Object procurar(Integer id) throws Exception {
        funcionario = new Funcionario();
        try {
            String consulta = "SELECT * FROM funcionario f JOIN pessoa p ON p.id = f.idPessoa "
                    + "JOIN endereco e ON p.endereco_id = e.id "
                    + "JOIN usuario u ON u.idPessoa = p.id "
                    + "JOIN funcao c ON c.id = f.funcao_id WHERE p.id = ?";
            conn = FabricaConexao.abreConexao();
            ps = conn.prepareStatement(consulta);
            ps.setInt(1, id);
            rs = ps.executeQuery();

            if (!rs.next()) {
                return funcionario;
            }

            funcionario.setId(rs.getInt("f.idPessoa"));
            funcionario.setEmail(rs.getString("p.email"));
            funcionario.setNome(rs.getString("p.nome"));
            funcionario.setSalario(rs.getDouble("f.salario"));
            funcionario.setCpf(rs.getString("p.cpf"));
            funcionario.setDataNasc(rs.getDate("p.dataNasc"));
            funcionario.setTelefone(rs.getString("p.telefone"));

            Funcao funcao = new Funcao();
            funcao.setId(rs.getInt("c.id"));
            funcao.setNome(rs.getString("c.nome"));
            funcionario.setFuncao(funcao);
            
            Usuario usuario = new Usuario();
            usuario.setLogin(rs.getString("u.login"));
            usuario.setSenha(rs.getString("u.senha"));
            funcionario.setUsuario(usuario);

            Endereco end = new Endereco();
            end.setId(rs.getInt("e.id"));
            end.setRua(rs.getString("e.rua"));
            end.setBairro(rs.getString("e.bairro"));
            end.setCidade(rs.getString("e.cidade"));
            end.setEstado(rs.getString("e.estado"));
            end.setCep(rs.getString("e.cep"));
            funcionario.setEndereco(end);

        } catch (Exception e) {
            throw new Exception("Funcionario - erro ao tentar PESQUISAR " + e.getMessage());
        } finally {
            FabricaConexao.fechaConexao(conn, ps, rs);
        }
        return funcionario;
    }

    @Override
    public List<Object> listar() throws Exception {
        List funcionarios = new ArrayList();
        try {
            String consulta = "SELECT f.*, p.*,e.*, t.*, c.* "
                    + "FROM funcionario f JOIN pessoa p ON p.id = f.idPessoa JOIN endereco e "
                    + "ON p.id = e.id JOIN funcao c ON c.id = f.funcao_id";
            conn = FabricaConexao.abreConexao();
            ps = conn.prepareStatement(consulta);
            rs = ps.executeQuery();


            while (rs.next()) {
                funcionario = new Funcionario();
                funcionario.setId(rs.getInt("p.id"));
                funcionario.setNome(rs.getString("p.nome"));
                funcionario.setSalario(rs.getDouble("f.salario"));
                funcionario.setCpf(rs.getString("p.cpf"));
                funcionario.setDataNasc(rs.getDate("p.nascimento"));
                funcionario.setTelefone(rs.getString("p.telefone"));

                Funcao funcao = new Funcao();
                funcao.setNome(rs.getString("f.nome"));
                funcionario.setFuncao(funcao);

                Endereco end = new Endereco();

                end.setRua(rs.getString("e.rua"));
                end.setBairro(rs.getString("e.bairro"));
                end.setCidade(rs.getString("e.cidade"));
                end.setEstado(rs.getString("e.estado"));
                end.setCep(rs.getString("e.cep"));
                funcionario.setEndereco(end);


                funcionarios.add(funcionario);
            }
        } catch (Exception e) {
            throw new Exception("Funcionario - Erro ao tentar LISTAR "
                    + e.getMessage());
        } finally {
            FabricaConexao.fechaConexao(conn, ps, rs);
        }
        return funcionarios;
    }
}
